package com.lancoo.edu.platform.operation.commons.config;

import com.lancoo.edu.platform.operation.commons.domain.api.system.ServerInfo;
import com.lancoo.edu.platform.operation.commons.exception.ServiceException;
import com.lancoo.edu.platform.operation.commons.service.api.YunBaseApiService;
import com.lancoo.edu.platform.operation.commons.utils.LancooMd5HashUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.util.Objects;
import java.util.Optional;

@Data
@Slf4j
@Component
@Configuration
public class LancooConfig {

    /**
     * 基础平台地址
     */
    @Value("${baseAddr}")
    private String baseUrl;

    /**
     * 文件上传路径
     */
    @Value("${file-save-path}")
    private String uploadPath;
    /**
     * 文件上传路径
     */
    @Value("${file-save-path}")
    private String fileSavePath;

    /**
     * 文件映射
     */
    @Value("${file-mapping}")
    private String fileMapping;

    /**
     * 数据备份地址
     */
    @Value("${back.save}")
    private String backSavePath;

    /**
     * 数据备份保留天数
     */
    @Value("${back.delete.days:30}")
    private Integer deleteBackupDays;

    /**
     * 数据库类型（dm、mysql、oceanBase）
     */
    @Value("${database.type}")
    private String databaseType;


    @Value("${server.servlet.context-path}")
    private String contextPath;


    @Value("${spring.datasource.username}")
    private String userName;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${datasource.port}")
    private String port;

    @Resource
    private final YunBaseApiService yunBaseApiService;

    /**
     * 本系统ID
     */
    // TODO 改
    public static final String SYS_ID = "491";

    /**
     * 本系统名称
     */
    public static final String SYS_NAME = "平台使用及运维";

    /**
     * 通知公告系统ID，同办公平台
     */
    public static final String NOTICE_SYS_ID = "264";

    /**
     * 办公平台锁控ID
     */
    public static final String LOCKER_ID = "297";

    /**
     * 基础平台地址
     */
    public static final String BASE_SYS_ID = "000";

    /**
     * 首页模块系统ID
     */
    public static final String HOMEPAGE_SYS_ID = "264";


    /**
     * 当前登录的设备类型-全部
     */
    public static final Integer DEVICE_TYPE_ALL = 0;

    /**
     * 当前登录的设备类型-PC
     */
    public static final String DEVICE_TYPE_PC = "2";

    /**
     * 当前登录的设备类型-移动设备（安卓）
     */
    public static final Integer DEVICE_TYPE_ANDROID = 3;

    /**
     * 当前登录的设备类型-移动设备（IOS）
     */
    public static final Integer DEVICE_TYPE_IOS = 4;

    /**
     * 获取文件没得访问路径
     *
     * @return 服务路径
     */
    public String getServiceUrl() {
        // 1、通过基础平台获取地址
        ServerInfo oneServerInfo = yunBaseApiService.getOneServerInfo(SYS_ID);
        Optional.ofNullable(oneServerInfo).orElseThrow(() -> new ServiceException("未获取到本平台地址"));
        return oneServerInfo.getWebSvrAddr();
    }

    /**
     * 校验系统ID与系统ID md5 反转后的密文
     * @param sysId 系统ID
     * @param secCode 系统ID md5 反转后的密文
     * @return true/成功；false/失败
     */
    public boolean checkSysId(String sysId, String secCode) {
        if (SYS_ID.equals(sysId)) {
            return secCode.equalsIgnoreCase(LancooMd5HashUtil.getSecCodeByReverseMd5(SYS_ID));
        }
        return false;
    }


    public File getUploadPath() {
        File file = new File(uploadPath);
        if (!file.exists()) {
            boolean mkdirs = file.mkdirs();
            if (!mkdirs) {
                log.error("上传文件目录失败");
            }
        }
        return file;
    }

    /**
     * 获取指定系统的根地址路径
     *
     * @return 服务路径
     */
    public String getRootUrl(String sysId) {
        ServerInfo oneServerInfo = yunBaseApiService.getOneServerInfo(sysId);
        if(Objects.isNull(oneServerInfo)) {
            return "";
        }
        return oneServerInfo.getWebSvrAddr();
    }

    /**
     * 获取当前系统环境
     *
     * @return 系统环境
     */
    public String getSystemEnv() {
        String osName = System.getProperty("os.name").toLowerCase();
        return osName.contains("windows") ? "windows" : "linux";
    }

}
